import cocotb
from cocotb.clock import Clock
from cocotb.triggers import RisingEdge, FallingEdge, Timer
from cocotb.utils import get_sim_time
import random
import atexit
import os
from cocotb import simulator  # 正确导入方式
@cocotb.test()
async def test_counter(dut):
    # 创建时钟（50 MHz，周期 20 ns）
    clock = Clock(dut.clk, 20, units="ns")
    cocotb.start_soon(clock.start())
    
    # 初始化信号
    dut.rst_n.value = 0
    dut.en.value = 0
    await Timer(20, units="ns")  # 等待时钟稳定
    
    # 复位释放
    dut.rst_n.value = 1
    await RisingEdge(dut.clk)
    
    # 主测试逻辑
    expected_cnt = 0
    for _ in range(50):
        dut.en.value = random.randint(0, 1)  # 随机使能
        await RisingEdge(dut.clk)  # 等待时钟上升沿（ovf 在此更新）
        await FallingEdge(dut.clk)  # 在时钟下降沿检查稳定值
        
        # 验证计数器值
        if dut.en.value == 1:
            if expected_cnt == 15:
                expected_cnt = 0
                #assert dut.ovf.value == 1, "溢出标志未置位"
            else:
                expected_cnt += 1
                #assert dut.ovf.value == 0, "溢出标志误触发"
        else:
            expected_cnt = int(dut.cnt.value)
            
        print(f"Time {get_sim_time(units='ns')}ns: cnt={dut.cnt.value}, ovf={dut.ovf.value}")
        await RisingEdge(dut.clk)